/**
 * 基于canvas的二维码生成工具
 * 简化版实现，用于替代uni.createQRCode
 */

const QRCode = {};

// QR码配置参数
const QRCodeConfig = {
  size: 200,            // 默认尺寸
  margin: 10,           // 边距
  backgroundColor: '#FFFFFF',  // 背景色
  foregroundColor: '#000000',  // 前景色
  errorCorrectLevel: 'M'       // 纠错级别 L, M, Q, H
};

/**
 * 生成简单二维码路径信息
 * 为了简化实现，这里使用的是固定图案
 * 实际应用中应该使用完整的QR码算法
 */
function generateQRData(text) {
  // 简化处理：根据文本长度生成不同的图案
  // 实际应用中，这里应该是完整的QR码编码算法
  const size = Math.min(Math.max(Math.ceil(text.length / 6), 4), 25);
  const matrix = Array(size).fill().map(() => Array(size).fill(false));
  
  // 绘制三个定位图案（左上、右上、左下）
  const positionPatterns = [
    [0, 0],  // 左上
    [0, size - 7],  // 左下
    [size - 7, 0]   // 右上
  ];
  
  positionPatterns.forEach(([startX, startY]) => {
    // 绘制外框
    for (let i = 0; i < 7; i++) {
      for (let j = 0; j < 7; j++) {
        if (
          i === 0 || i === 6 || j === 0 || j === 6 || // 外边框
          (i >= 2 && i <= 4 && j >= 2 && j <= 4) // 内部方块
        ) {
          if (startX + i < size && startY + j < size) {
            matrix[startX + i][startY + j] = true;
          }
        }
      }
    }
  });
  
  // 使用文本的hash值生成数据点
  const hash = simpleHash(text);
  for (let i = 0; i < hash.length; i++) {
    const val = parseInt(hash[i], 16);
    const row = 8 + Math.floor(i / 8);
    const col = 8 + (i % 8);
    
    if (row < size && col < size) {
      matrix[row][col] = (val % 2 === 1);
    }
  }
  
  return matrix;
}

/**
 * 简单的字符串哈希函数
 */
function simpleHash(str) {
  let hash = 0;
  for (let i = 0; i < str.length; i++) {
    hash = ((hash << 5) - hash) + str.charCodeAt(i);
    hash = hash & hash; // 转换为32位整数
  }
  
  // 转为16进制字符串并确保为正数
  const hexHash = Math.abs(hash).toString(16).padStart(8, '0');
  // 重复以获得更多数据点
  return hexHash.repeat(8);
}

/**
 * 在canvas上绘制二维码
 * @param {String} text 要编码的文本
 * @param {Object} canvasContext canvas上下文
 * @param {Number} x 起始x坐标
 * @param {Number} y 起始y坐标
 * @param {Number} width 宽度
 * @param {Number} height 高度（若为0则等于宽度）
 * @param {Function} callback 完成回调
 */
QRCode.draw = function(text, canvasContext, x, y, width, height, callback) {
  const h = height || width;
  const matrix = generateQRData(text);
  const dots = matrix.length;
  const tileSize = Math.floor(width / dots);
  const offset = Math.floor((width - tileSize * dots) / 2);
  
  // 先绘制白色背景
  canvasContext.setFillStyle(QRCodeConfig.backgroundColor);
  canvasContext.fillRect(x, y, width, h);
  
  // 绘制数据点
  canvasContext.setFillStyle(QRCodeConfig.foregroundColor);
  
  for (let i = 0; i < dots; i++) {
    for (let j = 0; j < dots; j++) {
      if (matrix[i][j]) {
        canvasContext.fillRect(
          x + offset + j * tileSize,
          y + offset + i * tileSize,
          tileSize,
          tileSize
        );
      }
    }
  }
  
  // 执行回调
  if (typeof callback === 'function') {
    callback();
  }
};

// 导出API
export const api = {
  draw: QRCode.draw
};

export default {
  api
}; 